/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package generadorabm;

import StrategyClass.Abstracta;
import StrategyClass.ClaseC;
import StrategyClass.Interface;
import StrategyClass.StrategyClase;
import StrategyFuncion.AbstractaF;
import StrategyFuncion.Funcion;
import StrategyFuncion.Geter;
import StrategyFuncion.StrategyFuncion;
import StrategyProcedimiento.AbstractaP;
import StrategyProcedimiento.Prosedimiento;
import StrategyProcedimiento.Seter;
import StrategyProcedimiento.StrategyProcedimiento;
import generadorcommun.EnumClase;
import generadorcommun.EnumMetodo;
import generadorcommun.GuardarArchivo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Martin
 */
public class CreadoraClase {
    private String nombreProyecto;
    private Clase clase;
    private List<Atributo> atributos = new LinkedList<Atributo>();
    private List<Metodo> metodos = new LinkedList<Metodo>();
    private List<Metodo> geters_Y_Seters = new LinkedList<Metodo>();
    private StrategyClase stClase;
    private StrategyFuncion stFuncion;
    private StrategyProcedimiento stProcedimiento;

    public CreadoraClase(String nombre){
        nombreProyecto = nombre;
    }
    public List<Metodo> getGeters_Y_Seters() {
        return geters_Y_Seters;
    }

    public void setGeters_Y_Seters(List<Metodo> geters_Y_Seters) {
        this.geters_Y_Seters = geters_Y_Seters;
    }

    public String getNombreProyecto() {
        return nombreProyecto;
    }

    public void setNombreProyecto(String nombreProyecto) {
        this.nombreProyecto = nombreProyecto;
    }
    
    public List<Atributo> getAtributos() {
        return atributos;
    }

    public void setAtributos(List<Atributo> atributos) {
        this.atributos = atributos;
    }

    public Clase getClase() {
        return clase;
    }

    public void setClase(Clase clase) {
        this.clase = clase;
    }

    public List<Metodo> getMetodos() {
        return metodos;
    }

    public void setMetodos(List<Metodo> metodos) {
        this.metodos = metodos;
    }

    public StrategyClase getStClase() {
        return stClase;
    }

    public void setStClase(Clase clase) {
        StrategyClase cl = null;
        if (clase.getTipoClase().equals(EnumClase.CLASS.toString())) {
            cl = new ClaseC();
        } else if (clase.getTipoClase().equals(EnumClase.ABSTRACT.toString())) {
            cl = new Abstracta();
        }
        if (clase.getTipoClase().equals(EnumClase.INTERFACE.toString())) {
            cl = new Interface();
        }
        this.stClase = cl;
    }

    public StrategyFuncion getStFuncion() {
        return stFuncion;
    }

    public void setStFuncion(Metodo met) {
        StrategyFuncion fun = null;
        if (met.getTipoMetodo().equals(EnumMetodo.FUNCTION.toString())) {
            fun = new Funcion();
        } else if (met.getTipoMetodo().equals(EnumMetodo.ABSTRACT.toString())) {
            fun = new AbstractaF();
        } else if (met.getTipoMetodo().equals(EnumMetodo.GETER.toString())) {
            fun = new Geter();
        }
        this.stFuncion = fun;
    }

    public StrategyProcedimiento getStProcedimiento() {
        return stProcedimiento;
    }

    public void setStProcedimiento(Metodo met) {
        StrategyProcedimiento p = null;
        if (met.getTipoMetodo().equals(EnumMetodo.PROCES.toString())) {
            p = new Prosedimiento();
        } else if (met.getTipoMetodo().equals(EnumMetodo.ABSTRACT.toString())) {
            p = new AbstractaP();

        } else if (met.getTipoMetodo().equals(EnumMetodo.SETER.toString())) {
            p = new Seter();
        }
        this.stProcedimiento = p;
    }

    public void generarClase(List<String> claseG, Clase clase,String nombre) {
        setStClase(clase);
        getStClase().darClase(claseG, clase, nombre);
    }

    public void generarSingleton(List<String> clase) throws IOException {
        List<String> singleton = GuardarArchivo.getInstance().leerTxt(null);
    }

    public void generarAtributos(List<String> clase) {
        for (Atributo atributo : atributos) {
            clase.add(clase.size() - 1, atributo.getTipoAtributo() + " " + atributo.getTipo() + " " + atributo.getNombre() + ";");
            Metodo seter = new Metodo();
            seter.setNombre(atributo.getNombre());
            seter.setTipo(atributo.getTipo());
            seter.setTipoRetorno("");
            seter.setTipoMetodo(EnumMetodo.SETER.toString());
            Metodo geter = new Metodo();
            geter.setNombre(atributo.getNombre());
            geter.setTipoRetorno(atributo.getTipo());
            geter.setTipoMetodo(EnumMetodo.GETER.toString());
            metodos.add(seter);
            metodos.add(geter);
        }
    }

    public void generarMetodos(List<String> clase, List<Metodo> metodos) {
        for (Metodo met : metodos) {
            if (met.getTipoRetorno().equals("")) {
                setStProcedimiento(met);
                getStProcedimiento().darMetodo(clase, met);
            } else {
                setStFuncion(met);
                getStFuncion().darMetodo(clase, met);
            }
        }
    }

    public void generarDataBase() {
    }

    public void generarCodigo() {
        List<String> codigoClase = new ArrayList<String>();
        generarClase(codigoClase, clase,getNombreProyecto());
        generarAtributos(codigoClase);
        generarMetodos(codigoClase, geters_Y_Seters);
        generarMetodos(codigoClase, metodos);
    }
}
